{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Automated Transformations\n",
    "\n",
    "Automated transformations provide convenient handling of constrained\n",
    "continuous variables during inference by transforming them to an\n",
    "unconstrained space. Automated transformations are crucial for\n",
    "expanding the scope of algorithm classes such as gradient-based Monte\n",
    "Carlo and variational inference with reparameterization gradients.\n",
    "\n",
    "A webpage version of this tutorial is available at\n",
    "http://edwardlib.org/tutorials/automated-transformations.\n",
    "\n",
    "## The Transform Primitive\n",
    "\n",
    "Automated transformations in Edward are enabled through the key\n",
    "primitive\n",
    "[`ed.transform`](http://edwardlib.org/api/ed/transform).\n",
    "It takes as input a (possibly constrained) continuous random variable\n",
    "$\\mathbf{x}$, defaults to a choice of transformation $T$, and returns a\n",
    "[`TransformedDistribution`](http://edwardlib.org/api/ed/models/TransformedDistribution)\n",
    "$\\mathbf{y}=T(\\mathbf{x})$ with unconstrained support.\n",
    "An optional argument allows you to manually specify the transformation.\n",
    "\n",
    "The returned random variable $\\mathbf{y}$'s density is the original\n",
    "random variable $\\mathbf{x}$'s density adjusted by the determinant of\n",
    "the Jacobian of the inverse transformation (Casella & Berger, 2002),\n",
    "\n",
    "$$p(\\mathbf{y}) = p(\\mathbf{x})~|\\mathrm{det}~J_{T^{-1}}(\\mathbf{y}) |.$$\n",
    "\n",
    "Intuitively, the Jacobian describes how a transformation warps unit\n",
    "volumes across spaces. This matters for transformations of random\n",
    "variables, since probability density functions must always integrate\n",
    "to one.\n",
    "\n",
    "## Automated Transformations in Inference\n",
    "\n",
    "To use automated transformations during inference, set the flag\n",
    "argument `auto_transform=True` in `inference.initialize`\n",
    "(or the all-encompassing method `inference.run`):\n",
    "\n",
    "```python\n",
    "inference.initialize(auto_transform=True)\n",
    "```\n",
    "\n",
    "By default, the flag is already set to `True`.\n",
    "With this flag, any key-value pair passed into inference's\n",
    "`latent_vars` with unequal support is transformed to the\n",
    "unconstrained space; no transformation is applied if already\n",
    "unconstrained. The algorithm is then run under\n",
    "`inference.latent_vars`, which explicitly stores the\n",
    "transformed latent variables and forgets the constrained ones.\n",
    "\n",
    "We illustrate automated transformations in a few inference examples.\n",
    "Imagine that the target distribution is a Gamma distribution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from __future__ import absolute_import\n",
    "from __future__ import division\n",
    "from __future__ import print_function\n",
    "\n",
    "import edward as ed\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import tensorflow as tf\n",
    "\n",
    "from edward.models import Empirical, Gamma, Normal\n",
    "from tensorflow.contrib.distributions import bijectors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = Gamma(1.0, 2.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This example is only used for illustration, but note this context of\n",
    "inference with latent variables of non-negative support occur\n",
    "frequently: for example, this appears when applying topic models with a deep exponential\n",
    "family where we might use a normal variational\n",
    "approximation to implicitly approximate latent variables with Gamma\n",
    "priors (in\n",
    "[`examples/deep_exponential_family.py`](https://github.com/blei-lab/edward/blob/master/examples/deep_exponential_family.py),\n",
    "we explicitly define a non-negative variational approximation).\n",
    "\n",
    "__Variational inference.__\n",
    "Consider a Normal variational approximation\n",
    "and use the algorithm [`ed.KLqp`](http://edwardlib.org/api/ed/KLqp)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000/1000 [100%] ██████████████████████████████ Elapsed: 3s | Loss: -0.195\n"
     ]
    }
   ],
   "source": [
    "qx = Normal(loc=tf.get_variable(\"qx/loc\", []),\n",
    "            scale=tf.nn.softplus(tf.get_variable(\"qx/scale\", [])))\n",
    "\n",
    "inference = ed.KLqp({x: qx})\n",
    "inference.run()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Gamma and Normal distribution have unequal support, so inference\n",
    "transforms both to the unconstrained space; normal is already\n",
    "unconstrained so only Gamma is transformed. `ed.KLqp` then\n",
    "optimizes with\n",
    "[reparameterization gradients](http://edwardlib.org/api/klqp).\n",
    "This means the Normal distribution's parameters are optimized to match\n",
    "the transformed (unconstrained) Gamma distribution.\n",
    "\n",
    "Oftentimes we'd like the approximation on the original (constrained)\n",
    "space. This was never needed for inference, so we must explicitly\n",
    "build it by first obtaining the target distribution's transformation\n",
    "and then inverting the transformation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x_unconstrained = inference.transformations[x]  # transformed prior\n",
    "x_transform = x_unconstrained.bijector  # transformed prior's transformation\n",
    "qx_constrained = ed.transform(qx, bijectors.Invert(x_transform))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The set of transformations is given by\n",
    "`inference.transformations`, which is a dictionary with keys\n",
    "given by any constrained latent variables and values given by their\n",
    "transformed distribution. We use the\n",
    "[`bijectors`](https://www.tensorflow.org/versions/master/api_docs/python/tf/distributions/bijectors)\n",
    "module in `tf.distributions` in order to handle invertible\n",
    "transformations.\n",
    "`qx_unconstrained` is a random variable distributed\n",
    "according to a inverse-transformed (constrained) normal distribution.\n",
    "For example, if the automated transformation from non-negative to\n",
    "reals is $\\log$, then the constrained approximation is a LogNormal\n",
    "distribution; here, the default transformation is the inverse of\n",
    "$\\textrm{softplus}$.\n",
    "\n",
    "We can visualize the densities of the distributions.\n",
    "The figure below shows that the inverse-transformed normal\n",
    "distribution has lighter tails than the Gamma but is overall a\n",
    "good fit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11d5852d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 6))\n",
    "sns.distplot(x.sample(50000).eval(), hist=False, label='x')\n",
    "sns.distplot(qx_constrained.sample(100000).eval(), hist=False, label='qx')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "__Gradient-based Monte Carlo.__\n",
    "Consider an Empirical approximation with 1000 samples\n",
    "and use the algorithm [`ed.HMC`](http://edwardlib.org/api/ed/HMC)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000/1000 [100%] ██████████████████████████████ Elapsed: 3s | Acceptance Rate: 0.978\n"
     ]
    }
   ],
   "source": [
    "qx = Empirical(params=tf.get_variable(\"qx/params\", [1000]))\n",
    "\n",
    "inference = ed.HMC({x: qx})\n",
    "inference.run(step_size=0.8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Gamma and Empirical have unequal support so Gamma is transformed to\n",
    "the unconstrained space; by implementation, discrete delta\n",
    "distributions such as Empirical and PointMass are not transformed.\n",
    "`ed.HMC` then simulates \n",
    "Hamiltonian dynamics and writes the\n",
    "unconstrained samples to the empirical distribution.\n",
    "\n",
    "In order to obtain the approximation on the original (constrained)\n",
    "support, we again take the inverse of the target distribution's\n",
    "transformation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x_unconstrained = inference.transformations[x]  # transformed prior\n",
    "x_transform = x_unconstrained.bijector  # transformed prior's transformation\n",
    "qx_constrained = Empirical(params=x_transform.inverse(qx.params))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Unlike variational inference, we don't use `ed.transform` to\n",
    "obtain the constrained approximation, as it only applies to continuous\n",
    "distributions. Instead, we define a new Empirical distribution whose\n",
    "parameters (samples) are given by transforming all samples stored in\n",
    "the unconstrained approximation.\n",
    "\n",
    "We visualize the densities of the distributions.\n",
    "The figure below indicates that the samples accurately fit the Gamma\n",
    "distribution up to simulation error."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11eb6b410>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 6))\n",
    "sns.distplot(x.sample(50000).eval(), hist=False, label='x')\n",
    "sns.distplot(qx_constrained.sample(100000).eval(), hist=False, label='qx')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Acknowledgements & Remarks\n",
    "\n",
    "Automated transformations have largely been popularized by Stan\n",
    "for Hamiltonian Monte Carlo (Carpenter et al., 2016).\n",
    "This design is inspired by Stan's. However, a key distinction is that Edward\n",
    "provides users the ability to wield transformations and more flexibly\n",
    "manipulate results in both the original (constrained) and inferred\n",
    "(unconstrained) space.\n",
    "\n",
    "Automated transformations are also core to the algorithm automatic\n",
    "differentiation variational inference (Kucukelbir et al., 2017),\n",
    "which allows it to select a default variational family of normal\n",
    "distributions. However, note the automated transformation from\n",
    "non-negative to reals in Edward is not $\\log$, which is used in Stan;\n",
    "rather, Edward uses $\\textrm{softplus}$ which is more numerically\n",
    "stable (see also Kucukelbir et al. (2017, Fig. 9)).\n",
    "\n",
    "Finally, note that not all inference algorithms use or even need\n",
    "automated transformations.\n",
    "[`ed.Gibbs`](http://edwardlib.org/api/ed/Gibbs), moment\n",
    "matching with EP using Edward's conjugacy, and\n",
    "[`ed.KLqp`](http://edwardlib.org/api/ed/KLqp)\n",
    "with\n",
    "score function gradients all perform inference on the original latent\n",
    "variable space.\n",
    "Point estimation such as [`ed.MAP`](http://edwardlib.org/api/ed/MAP) also\n",
    "use the original latent variable space and only requires a\n",
    "constrained transformation on unconstrained free parameters.\n",
    "Model parameter estimation such as\n",
    "[`ed.GANInference`](http://edwardlib.org/api/ed/GANInference) do not even\n",
    "perform inference over latent variables."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
